//////////////////////////////////////////////////////////////

//SOURCE FILE: planif_main.c

//PROCESO PLANIFICADOR DE DISCO

//Autor: Pablo Bergna

//////////////////////////////////////////////////////////////
//INCLUDES BASICOS
#include "includes/todo_incluido.h"
#include "includes/tipos_disco.h"
//INCLUDE DE SI MISMO
#include "../includes/planif_main.h"
//OTROS INCLUDES
#include "../includes/manejo_disco.h"
#include "../includes/config_disco.h"
#include "../includes/logeo_disco.h"

//**********************************************************
//**********COMIENZO DE DEFINICIONES DE FUNCIONES***********
//*********************************************************


/***********************************************************************
FUNCION: VERIFICAR_POSICION

PROCESO: PPD

Autor: Pablo Bergna

PRE: posicion ya tiene memoria asignada

POST:

DEVUELVE: 0 si posicion esta dentro de los valores estipulados (entre 1 y 512MB / 512 bytes)
		  -1 si esta fuera del rango

FUNCION PPAL: verifica que una posicion sea correcta (dentro del rango de disco)
***********************************************************************/

int verificar_posicion(int posicion){
	if ((posicion < 1048577) && (posicion > 0))  return 0;
	return -1;
}

/***********************************************************************
FUNCION: ESCRIBIR_SECTOR

PROCESO: PPD

Autor: Pablo Bergna

PRE: mi_disco ya existe y tiene datos (apunta a un archivo real)

POST: si sale bien devuelve cero y queda en el disco escrito lo que se paso en char* sector

DEVUELVE: 0 si salio todo bien
		  -1 si hubo error
		  -2 si posicion incorrecta

FUNCION PPAL: Escribe en el disco un sector dado
***********************************************************************/

int escribir_sector(td_disco* mi_disco,char* sector,int posicion){
	int tarda,err;
	td_chs chs_target;

	if (verificar_posicion(posicion) == -1) return -2;

	convertir_posic_en_chs(posicion,mi_disco->chs_conf,&chs_target);

	tarda = calcular_tiempo_en_alcanzar(mi_disco,chs_target,&tarda) + mi_disco->sector_write_speed;

	mover_cabezal(mi_disco,chs_target);
	posicionar_archivo(mi_disco->disco,posicion);

	//<HACER> categorizar errores de fwrite
	err = fwrite_unlocked(sector, 1, TAM_SECTOR, mi_disco->disco);

	if (err) return -1;

	return 0;
}


/***********************************************************************
FUNCION: LEER_SECTOR

PROCESO: PPD

Autor: Pablo Bergna

PRE: mi_disco ya existe y tiene datos (apunta a un archivo real)

POST: si sale bien devuelve en char* sector el sector leido del disco
en la posicion marcada por parametro

DEVUELVE: 0 si salio todo bien
		  -1 si hubo error

FUNCION PPAL: Lee del disco un sector dado
***********************************************************************/

int leer_sector(td_disco* mi_disco,char* sector,int posicion){
	int tarda,err;
	td_chs chs_target;

	//<HACER>

	if (verificar_posicion(posicion) == -1) return -2;

	convertir_posic_en_chs(posicion,mi_disco->chs_conf,&chs_target);
	tarda = calcular_tiempo_en_alcanzar(mi_disco,chs_target,&tarda) + mi_disco->sector_read_speed;

	mover_cabezal(mi_disco,chs_target);
	posicionar_archivo(mi_disco->disco,posicion);

	err = fread_unlocked(sector, 1, TAM_SECTOR, mi_disco->disco);

	if (err) return -1;

	return 0;
}

int main(){
	td_disco *v_mi_disco = NULL;
	char *sector = malloc(TAM_SECTOR);
	int posicion=0,err=0;

	//CREAR DISCO
	crear_disco(v_mi_disco);

	//LEER CONFIG
	leer_config(v_mi_disco);

	//system(pause);

	//ABRIR DISCO
	err = abrir_disco(v_mi_disco->path,v_mi_disco->disco);
	if (err != 0){
		puts("ERROR AL ABRIR DISCO");
	}

	//ESCRIBIR DISCO
	err = escribir_sector(v_mi_disco,sector,posicion);
	if (err != 0){
		puts("ERROR AL ESCRIBIR DISCO");
	}

	//LEER DISCO
	err = leer_sector(v_mi_disco,sector,posicion);
	if (err != 0){
		puts("ERROR AL LEER DISCO");
	}

	//ELIMINAR DISCO
	eliminar_disco(v_mi_disco);

	free(sector);

	return 0;
}

//**********************************************************
//**********FIN DE DEFINICION DE FUNCIONES******************
//**********************************************************
